package com.lib76.buildCode.service;

import java.util.LinkedHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.lib76.buildCode.model.DbConfig;
import com.lib76.buildCode.model.PageConfig;
import com.lib76.buildCode.model.PageEntity;
import com.lib76.buildCode.model.PageEntityField;
import com.lib76.buildCode.model.Project;
import com.lib76.buildCode.model.TableEntity;
import com.lib76.buildCode.model.TableFieldEntity;
import com.lib76.buildCode.utils.CommonUtils;

/**
 * 项目中的实体操作服务，修改数据库配置的同时也修改页面配置<br/>
 * 使用PageConfigServer或DbConfigServer
 * @author 张浩
 * @version 0.0.4
 * @since 0.0.3
 * @deprecated
 */
public class EntityOperateServer {
	
	final static Logger logger = LoggerFactory.getLogger(EntityOperateServer.class);

	/**
	 * 修改实体的类名，同时修改页面配置
	 * @param project
	 * @param spaces
	 * @param tablePattern
	 */
	public static void updateEntityClassName(Project project,String[] spaces,String tablePattern){
		DbConfig dbConfig = project.getDbConfig();
		PageConfig pageConfig = project.getPageConfig();
		if(!ArrayUtils.isEquals(dbConfig.getSpaces(), spaces) || !StringUtils.equals(dbConfig.getTablePattern(),tablePattern)){
			for(TableEntity table:dbConfig.getTables().values()){
				PageEntity pageEntity  = null;
				if(pageConfig != null){
					pageEntity = pageConfig.getEntitys().remove(table.getClassName()); //移除
					if(pageEntity == null){pageEntity = tableToPageEntity(table);}
				}
				table.setClassName(buildClassName(tablePattern,spaces,table.getTableName()));
				if(pageEntity != null){
					pageEntity.setEntityClassName(table.getClassName());
					pageConfig.getEntitys().put(pageEntity.getEntityClassName(), pageEntity);
				}
			}
		}
	}
	
	/**
	 * 添加一个数据库表实体，如果存在页面配置需要添加一个页面实体
	 * @param project
	 * @param table
	 */
	public static void addTableEntity(Project project,TableEntity table){
		DbConfig dbConfig = project.getDbConfig();
		PageConfig pageConfig = project.getPageConfig();
		table.setClassName(buildClassName(dbConfig.getTablePattern(),dbConfig.getSpaces(),table.getTableName()));
		dbConfig.getTables().put(table.getTableName(), table);
		if(pageConfig != null){
			PageEntity pageEntity = tableToPageEntity(table);
			pageConfig.getEntitys().put(pageEntity.getEntityClassName(), pageEntity);
		}
	}
	
	/**
	 * 修改一个数据库表实体
	 * @param project
	 * @param table
	 */
	public static void updateTableEntity(Project project,TableEntity table){
		DbConfig dbConfig = project.getDbConfig();
		PageConfig pageConfig = project.getPageConfig();
		PageEntity pageEntity = null;
		if(pageConfig != null){
			pageEntity = pageConfig.getEntitys().remove(table.getClassName());
		}
		table.setClassName(buildClassName(dbConfig.getTablePattern(),dbConfig.getSpaces(),table.getTableName()));
		if(pageEntity != null){
			pageEntity.setEntityClassName(table.getClassName());
			pageEntity.setEntityChinaName(table.getTableChinaName());
			LinkedHashMap<String,PageEntityField> temp = new LinkedHashMap<String,PageEntityField>();
			for(TableFieldEntity field:table.getFields().values()){
				PageEntityField pageEntityField = pageEntity.getFields().get(field.getCode());
				complementEntityField(field,pageEntityField);
				temp.put(pageEntityField.getCode(), pageEntityField);
			}
			pageEntity.setFields(temp);//覆盖
			pageConfig.getEntitys().put(pageEntity.getEntityClassName(), pageEntity);
		}else if(pageConfig != null){
			pageEntity = tableToPageEntity(table);
			pageConfig.getEntitys().put(pageEntity.getEntityClassName(), pageEntity);
		}
		
		dbConfig.getTables().put(table.getTableName(), table);
	}
	
	/**
	 * 保存数据库表字段
	 * 1.获取对应的页面实体，如果没有则不做页面实体更新
	 * 2.移除页面实体中该字段的配置，如果没有就创建新的，更新后重新加入到页面实体
	 * @param project
	 * @param table
	 * @param id
	 * @param field
	 */
	public static void saveTableFieldEntity(Project project,TableEntity table,String id,TableFieldEntity field){
		PageConfig pageConfig = project.getPageConfig();
		PageEntity pageEntity = null;
		if(pageConfig != null){
			pageEntity = pageConfig.getEntitys().get(table.getClassName());
		}
		TableFieldEntity oldField = table.getFields().remove(id);
		if(pageEntity != null){
			PageEntityField pageEntityField = null;
			if(oldField != null){
				pageEntityField = pageEntity.getFields().remove(oldField.getCode());
			}
			pageEntityField = complementEntityField(field,pageEntityField);
			pageEntity.getFields().put(pageEntityField.getCode(), pageEntityField);
		}
		
		table.getFields().put(field.getCode(), field);
	}
	
	/**
	 * 移除数据库表配置
	 * @param project
	 * @param tableName
	 */
	public static void deleteTableEntity(Project project,String tableName){
		TableEntity table = project.getDbConfig().getTables().remove(tableName);
		PageConfig pageConfig = project.getPageConfig();
		if(table != null && pageConfig != null){
			pageConfig.getEntitys().remove(table.getClassName());
		}
	}
	
	/**
	 * 移除数据库表字段配置
	 * @param project
	 * @param table
	 * @param code
	 */
	public static void deleteTableFieldEntity(Project project,TableEntity table,String code){
		table.getFields().remove(code); //移除数据库表配置中字段
		PageConfig pageConfig = project.getPageConfig();
		PageEntity pageEntity = null;
		if(pageConfig != null){
			pageEntity = pageConfig.getEntitys().get(table.getClassName());
			if(pageEntity != null){
				pageEntity.getFields().remove(code); //移除页面实体配置中字段
			}else{
				logger.error("msg={}","删除数据库表字段时未发现对应的页面实体");
			}
		}
	}
	
	/**
	 * 更新页面实体配置
	 * @param project
	 * @param pageEntity
	 */
	public static void udpatePageEntity(Project project,PageEntity pageEntity){
		if(CommonUtils.isChinese(pageEntity.getEntityChinaName())){
			DbConfig dbConfig = project.getDbConfig();
			for(TableEntity table : dbConfig.getTables().values()){
				if(pageEntity.getEntityClassName().equals(table.getClassName())){
					//如果不是中文就更新
					if(!CommonUtils.isChinese(table.getTableChinaName())){ 
						table.setTableChinaName(pageEntity.getEntityChinaName());
					}
					break;
				}
			}
		}
	}
	
	/**
	 * 更新页面实体字段配置
	 * @param project
	 * @param pageEntity
	 * @param pageEntityField
	 */
	public static void updatePageEntityField(Project project,PageEntity pageEntity,PageEntityField pageEntityField){
		if(CommonUtils.isChinese(pageEntityField.getName())){
			DbConfig dbConfig = project.getDbConfig();
			for(TableEntity table : dbConfig.getTables().values()){
				if(pageEntity.getEntityClassName().equals(table.getClassName())){
					TableFieldEntity field = table.getFields().get(pageEntityField.getCode());
					if(field != null){
						//如果不是中文就更新
						if(!CommonUtils.isChinese(field.getName())){
							field.setName(pageEntityField.getName());
						}
					}else{
						logger.error("msg={}","更新页面实体字段时未发现对应的数据库表字段");
					}
					break;
				}
			}
		}
	}
	
	/**
	 * 根据数据库表配置构建页面实体配置
	 * @param table
	 * @return
	 */
	public static PageEntity tableToPageEntity(TableEntity table){
		PageEntity pageEntity = new PageEntity();
		pageEntity.setEntityClassName(table.getClassName());
		pageEntity.setEntityChinaName(table.getTableChinaName());
		for(TableFieldEntity field:table.getFields().values()){
			PageEntityField pageEntityField = tableFieldToPageEntityField(field);
			pageEntity.getFields().put(pageEntityField.getCode(), pageEntityField);
		}
		return pageEntity;
	}
	
	/**
	 * 将数据库表字段转换成页面实体配置字段
	 * @param field
	 * @return
	 */
	public static PageEntityField tableFieldToPageEntityField(TableFieldEntity field){
		PageEntityField entityField = new PageEntityField();
		entityField.setCode(field.getCode());
		entityField.setName(field.getName());
		if(field.getLength() != null){
			if(field.getLength()>=300){
				entityField.setIsDisplayTable(false);
			}
			if(field.getLength()>=500){
				entityField.setInputType("textarea");
			}
		}
		if("Date".equals(field.getType())){
			entityField.setInputType("date");
		}else if("Boolean".equals(field.getType())){
			entityField.setInputType("checkbox");
		}
		if(field.getIsKey()){
			entityField.setInputType("hidden");
		}
		return entityField;
	}
	
	/**
	 * 数据库表字段与页面实体字段互补，以数据库表字段为主
	 * @param tableField
	 * @param pageEntityField
	 */
	public static PageEntityField complementEntityField(TableFieldEntity tableField,PageEntityField pageEntityField){
		if(pageEntityField != null){
			//如果包含中文
			if(CommonUtils.isChinese(pageEntityField.getName())){
				//如果不包含中文
				if(!CommonUtils.isChinese(tableField.getName())){ 
					tableField.setName(pageEntityField.getName());
				}
			}else{
				pageEntityField.setName(tableField.getName());
			}
		}else{
			pageEntityField = new PageEntityField();
			pageEntityField.setCode(tableField.getCode());
			pageEntityField.setName(tableField.getName());
		}
		return pageEntityField;
	}
	
	/**
	 * 构建数据库表的类名
	 * @param tablePattern
	 * @param spaces
	 * @param tableName
	 * @return
	 */
	public static String buildClassName(String tablePattern,String[] spaces,String tableName){
		String result = tableName;
		if(StringUtils.isNotBlank(tablePattern)){
			Pattern pat = Pattern.compile(tablePattern);
			Matcher mat = pat.matcher(result);
			if(mat.find() && mat.groupCount() > 0){
				result = "";
				for(int i=1;i<=mat.groupCount();i++){
					result = result + removeSpace(spaces,mat.group(i));
				}
			}else{
				result = removeSpace(spaces,result);
			}
		}else{
			result = removeSpace(spaces,result);
		}
		return result;
	}
	
	public static String removeSpace(String[] spaces,String str){
		String result = StringUtils.capitalize(str);
		if(spaces != null && spaces.length > 0){
			for(int i=0;i<spaces.length;i++){
				String[] temp = result.split(spaces[i]);
				if(temp != null && temp.length >0){
					result = "";
					for(int j=0;j<temp.length;j++){
						result = result + StringUtils.capitalize(temp[j]);
					}
				}
			}
		}
		return result;
	}
}
